package top.fwpsl.redis;

/**
 * key 相关操作
 *
 * @auther: 风戏fw
 * @date: 2020/11/21
 */
public interface IJedisKeyClient {

    /**
     * 删除给定的一个或多个 key
     *
     * 时间复杂度：
     *      O(N)， N 为被删除的 key 的数量。
     *      删除单个字符串类型的 key ，时间复杂度为O(1)。
     *      删除单个列表、集合、有序集合或哈希表类型的 key ，时间复杂度为O(M)， M 为以上数据结构内的元素数量。
     * @param keys
     * @return 被删除 key 的数量
     */
    long del(String... keys);

    /**
     * 检查给定 key 是否存在
     *
     * 时间复杂度：O(1)
     * @param key
     * @return 若 key 存在，返回 1 ，否则返回 0
     */
    long exists(String key);

    /**
     * 设置过期时间
     *
     * 注意(一个带有过期时间的key)：
     *  更新值时，过期时间不变，例如：incr、lpush、hset
     *  替换值时，过期时间会发生变化, 例如：set、getset、del
     *
     * 时间复杂度：O(1)
     * @param key
     * @param expires 过期时间(单位：秒)
     * @return 设置成功返回 1, 否则返回0
     */
    long expire(String key, long expires);

    /**
     * 设置过期时间，与expire类似
     *
     * 时间复杂度：O(1)
     * @param key
     * @param timestamp UNIX 时间戳(unix timestamp)，单位：秒
     * @return 设置成功返回 1, 否则返回0
     */
    long expireat(String key, long timestamp);

    /**
     * 查找所有符合给定模式 pattern 的 key
     * （容易造成性能问题，在大的数据库或者正式环境尽量少使用）
     *
     * 说明：
     *      '?'：匹配单位字符
     *      '*'：匹配多个字符
     *      '[abc]'：匹配列表中的任务字符
     *
     * 时间复杂度：O(N)， N 为数据库中 key 的数量
     * @param pattern
     * @return 符合给定模式的 key 列表
     */
    String[] keys(String pattern);

    /**
     * 移除key的过期时间
     *
     * 时间复杂度：O(1)
     * @param key
     * @return 移除成功返回1；否则返回0(key不存在或者没有设置生效时间)
     */
    long persist(String key);

    /**
     * 与'expire'类型，单位：毫秒
     * @param key
     * @param expires
     * @return
     */
    long pexpire(String key, long expires);

    /**
     * 与'expireat'类似，单位：毫秒
     * @param key
     * @param timestamp
     * @return
     */
    long pexpireat(String key, long timestamp);

    /**
     * 与'ttl' 类似，单位：毫秒
     * @param key
     * @return
     */
    long pttl(String key);

    /**
     * 从当前数据库中随机返回一个key
     *
     * 时间复杂度：O(1)
     * @return 当数据库为空时，返回nil；否则返回一个key
     */
    String randomKey();

    /**
     * 将key改名为newkey;
     * （当 key 和 newkey 相同，或者 key 不存在时，返回一个错误）
     *
     * @param key
     * @param newKey
     * @return 改名成功时提示 OK ，失败时候返回一个错误
     */
    boolean rename(String key, String newKey);

    /**
     * 当且仅当 newkey 不存在时，将 key 改名为 newkey 。
     * 当 key 不存在时，返回一个错误。
     *
     * @param key
     * @param newKey
     * @return 修改成功返回1；如果newkey已经存在，返回0
     */
    boolean ranamenx(String key, String newKey);

    /**
     * 返回给定 key 的剩余生存时间(TTL, time to live)
     *
     * 时间复杂度：O(1)
     * @param key
     * @return  当 key 不存在时，返回 -2 。
     *          当 key 存在但没有设置剩余生存时间时，返回 -1 。
     *          否则，以秒为单位，返回 key 的剩余生存时间。
     */
    long ttl(String key);

    /**
     * 返回 key 所储存的值的类型
     *
     * 时间复杂度： O(1)
     * @param key
     * @return none (key不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)
     */
    String type(String key);
}
